package com.itany.corejava.util;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月14日 16:28
 */

import com.itany.corejava.constant.DateUtilConstant;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;

/**
 * 到util包中新建一个DateUtil类
 * 1.将日期转换成字符串，使用方法重载定义两个方法
 * 方法一：一个参数(传进来指定的日期,默认格式)
 * 方法二:二个参数(传进来指定的日期,传进来指定格式)
 *
 * 2.将指定格式的字符串转换成日期，使用方法重载定义两个方法
 * 方式一:一个参数(使用默认格式的日期格式)
 * 方式二:二个参数(传进来的日期字符串，传进来的字符串格式)
 *
 * 3.计算指定日期的前一天
 * 一个参数
 *
 * 4.计算指定日期的后一天
 *一个参数
 *
 * 5.计算两个日期之间相差的天数
 * 二个参数(直接保留整数)
 *
 * 6.获取指定日期中的年、月、日、时、分、秒的值，在控制台输出
 * 一个参数(传递一个日期进来)
 *
 * 7.获取指定日期中的年、月、日、时、分、秒的值
 * 二个参数(传递一个日期进来，指定一个字段)
 *
 * 8.根据指定的年份与月份，获取这一年这个月共有多少天
 * 二个参数(一个表示年份，一个表示月份)
 *
 */
public class DateUtil {


    /**
     * 将日期转换成默认格式的字符串
     * @param date 需要转换的日期
     * @return 转换后的字符串
     */
    public static String toString(Date date){
        // DateFormat dateFormat=new SimpleDateFormat(DateUtilConstant.DATE_DEFAULT_PATTERN);
        // String dateStr=dateFormat.format(date);
        // return dateStr;
        return new SimpleDateFormat(DateUtilConstant.DATE_DEFAULT_PATTERN).format(date);

    }

    /**
     *  将日期转换成指定格式的字符串
     * @param date 需要转换的日期
     * @param pattern 需要转换的格式
     * @return 转换后的字符串
     */
    public static String toString(Date date,String pattern){

        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * 将指定的字符串转换为日期
     * @param dateStr 字符串
     * @return 日期对象
     * @throws ParseException
     */
    public static Date toDate(String dateStr) throws ParseException {
        return new SimpleDateFormat(DateUtilConstant.DATE_DEFAULT_PATTERN).parse(dateStr);
    }

    /**
     * 将指定的字符串转换为日期
     * @param dateStr 字符串
     * @param pattern 格式
     * @return 日期对象
     * @throws ParseException
     * 注意：dateStr要和pattern格式一致
     */
    public static Date toDate(String dateStr,String pattern) throws ParseException {
        return new SimpleDateFormat(pattern).parse(dateStr);
    }

    /**
     * 获取指定日期的前一天
     * @param date 指定的日期
     * @return 指定日期的前一天
     */
    public static Date getYesterday(Date date){
        long time=date.getTime()-DateUtilConstant.ONE_DAY_MILLISECONDS;
        return new Date(time);
    }

    /**
     * 获取指定日期的后一天
     * @param date 指定的日期
     * @return 指定日期的后一天
     */
    public static Date getTomorrowDay(Date date){
        long time=date.getTime()+DateUtilConstant.ONE_DAY_MILLISECONDS;
        return new Date(time);
    }

    /**
     * 计算两个日期之间相差的天数
     * @param beginDate 起始时间
     * @param endDate 截止时间
     * @return 天数
     */
    public static int getDuringDay(Date beginDate,Date endDate){
        long time=endDate.getTime()-beginDate.getTime();
        int day=(int)(time/DateUtilConstant.ONE_DAY_MILLISECONDS);
        return day;
    }


    /**
     * 获取指定日期中的年、月、日、时、分、秒的值，在控制台输出
     * @param date 传进来的日期
     */
    public static void get(Date date){
        String s=toString(date);//将指定日期转换为字符串:2023-11-11 12:12:12
        String reg="[- :]";
        String[] arr=s.split(reg);
        System.out.println(Arrays.toString(arr));
        System.out.println("年份是:"+arr[0]+",月份是:"+arr[1]+",日期:"+arr[2]+"，时间:"+arr[3]+",分:"+arr[4]+"，秒:"+arr[5]);

    }

    /**
     * 获取指定日期中的年、月、日、时、分、秒中的部分值
     * @param date
     * @param index
     * @return
     */
    public static int get2(Date date,int index){
        String s=toString(date);//将指定日期转换为字符串:2023-11-11 12:12:12
        String reg="[- :]";
        String[] arr=s.split(reg);
        System.out.println(Arrays.toString(arr));
        return Integer.parseInt(arr[index]);
    }


    /**
     * 计算某年某月有多少天
     * @param year 传入进来的年份
     * @param month 传入进来的月份
     * @return 天数
     */
    public static int getDay(int year,int month){//2023  11
        Calendar calendar=Calendar.getInstance();
        //设置日期的年份
        calendar.set(Calendar.YEAR,year);
        //设置日期的月份
        calendar.set(Calendar.MONTH,month);
        //设置日期的日期
        calendar.set(Calendar.DATE,0);
        // System.out.println(calendar.getTime());
        // System.out.println(calendar.get(Calendar.DATE));
        int days=calendar.get(Calendar.DATE);
        System.out.println(year+"年"+month+"月有"+days+"天");
        return days;
    }

    public static int getDay2(int year,int month){
        Calendar calendar=Calendar.getInstance();
        //设置日期的年份
        calendar.set(Calendar.YEAR,year);
        //设置日期的月份(月份的取值是0-11)
        calendar.set(Calendar.MONTH,month-1);

        //获取你当前的年份的所在月的那个月的最大的日期
        return calendar.getActualMaximum(Calendar.DATE);
    }

}
